package fichiers;

import java.io.*;
import java.util.*;
import support.*;


public abstract class Element implements ModelInterface, VueInterface {
    
    private File fichierCourant;
    private String nom;
    private Dossier parent;
    private ArrayList<VueInterface> vues;
    private ModelInterface model;
    
    public Element(Dossier pere,File courant,String nom) {
        
        this.vues=new ArrayList();
        this.nom=nom;
        this.fichierCourant=courant;
        this.parent=pere;
        this.model=null;
    }
    
    public abstract boolean estUnDossier();
    
    
    public File getFichierCourant(){
        
        return this.fichierCourant;
    }
    
    public Dossier getPere(){
        
        return this.parent;
    }
    
    public String toString(){
        
        return this.nom;
    }
    
    public void setNom(String nom) {
        this.nom = nom;        
    }
    
    public void setModel(ModelInterface model){
        
        this.model=model;
    }
    
    public void supprimerDuDisque(){
        
        boolean b=this.fichierCourant.delete();
        if(b){
          
            this.getPere().supprimerSousElement(this);
        }
    }
    
    public void prevenirVueAjout(Element nouveau) {
        
        Iterator<VueInterface> i=vues.iterator();
        while(i.hasNext()){
            
            VueInterface temp=i.next();
            temp.mettreAJourAjout(nouveau);
        }
    }
    
    public void prevenirVueSuppression(Element courant) {
        
        Iterator<VueInterface> i=vues.iterator();
        while(i.hasNext()){
            
            VueInterface temp=i.next();
            temp.mettreAJourSuppression(courant);
        }
    }
    
    public void prevenirVueModificationVerification(Element courant) {
        
        ArrayList temp=new ArrayList(this.vues);
        Iterator<VueInterface> i=temp.iterator();
        while(i.hasNext()){
            
            VueInterface suiv=i.next();
            suiv.mettreAJourVerification(courant);
        }
        
    }
    
    public void ajouterVue(VueInterface v) {
        this.vues.add(v);
    }
    
    public void retirerVue(VueInterface v) {
        this.vues.remove(v);
    }
    
    //renvoit le fichier ou null si fichier inexistant
    public Element getElement(String path){
        
        return this.recupererFichierRecursive(path,(Dossier)this,null);
    }
    
    public Element recupererFichierRecursive(String path,Dossier courant,Element retour){
        
        if(courant.getFichierCourant()!=null && path.equals(courant.getFichierCourant().getPath())){
            
            retour=courant;
            
        }else{
            
            ArrayList listeDossiers=courant.getDossiers();
            if(listeDossiers.size()!=0){
                
                Iterator i=listeDossiers.iterator();
                while(i.hasNext()){
                    
                    Element suiv=(Element) i.next();
                    if(suiv.estUnDossier()){
                        retour=this.recupererFichierRecursive(path,(Dossier) suiv, retour);
                    }
                    
                }
                
            }
        }
        return retour;
    }
    
    public void mettreAJourVerification(Element courant) {
        
        this.getPere().supprimerSousElement(this);
        this.model.retirerVue(this);
    }
    
    public void mettreAJourSuppression(Element courant) {
    }
    
    public void mettreAJourAjout(Element nouveau) {
    }
    
}
